import pygame
from plane_sprite import *  #飞机大战主游戏
import time
import tkinter.messagebox
import ctypes
class PlaneGame:
    def __init__(self):
        print('游戏初始化')
        #1.创建窗口
        self.screen = pygame.display.set_mode(SCREEN_RECT.size)
        #2.创建游戏时钟
        self.clock = pygame.time.Clock()
        #3.调用私有方法，创建精灵和精灵组
        self.__create_sprites()

        #设置定时器事件 ----每隔一秒触发一下事件
        pygame.time.set_timer(CREATE_ENEMY_EVENT,1000)
        pygame.time.set_timer(HERO_FIRE_EVENT,200)
    def __create_sprites(self):
        '''  创建精灵和精灵组'''
        #创建背景图精灵和精灵组
        self.bg = BackGround()
        self.bg1 = BackGround(True)
        self.back_ground = pygame.sprite.Group(self.bg,self.bg1)
        #创建敌机精灵组
        self.enemy_group = pygame.sprite.Group()
        # 创建英雄机精灵和精灵组
        self.hero = Hero()
        self.hero_grpup = pygame.sprite.Group(self.hero)
    def start_game(self):
        print('游戏开始')
        #游戏循环标志着游戏开始
        while  True:
            #设置刷新帧率
            self.clock.tick(60)
            #事件监听   ----调用私有化方法使用
            self.__event_handler()
            #碰撞检测   ----调用私有化
            self.__check_collide()
            #更新/绘制精灵组   ---调用私有化方法实现
            self.__update_sprite()
            #更新显示
            pygame.display.update()
            pass
        # 定义事件监听   ----调用私有化方法使用
    def __event_handler(self):
            #捕获监听事件
        for event in pygame.event.get():   #  得到事件的列表
                #判断是否退出游戏
            if event.type == pygame.QUIT:
                    #调用退出方法退出游戏
                 print('退出游戏')
                 self.__game_over()
            elif event.type == CREATE_ENEMY_EVENT:
                print('敌机出场了')
                #创建敌机精灵
                enemy = Enemy()

                enemy2 = Enemy2()
                #使用精灵组的add方法将精灵添加到精灵组中
                self.enemy_group.add(enemy2)
                self.enemy_group.add(enemy)
            #判断时间是否发生
            elif event.type == HERO_FIRE_EVENT:
                self.hero.fire()
        #使用键盘提供的方法获取键盘按键   为一个元组
        keys_pressed = pygame.key.get_pressed()
        #判断元组中对应的按键索引值是否为1
        if keys_pressed[pygame.K_RIGHT]:
            self.hero.speed = 8
        elif keys_pressed[pygame.K_LEFT]:
            self.hero.speed = -8
        elif keys_pressed[pygame.K_DOWN]:
            self.hero.yspeed = 2
        elif keys_pressed[pygame.K_UP]:
            self.hero.yspeed  = -2
        else:
            self.hero.speed = 0
            self.hero.yspeed = 0
    # 定义碰撞检测
    def __check_collide(self):
        '''检查碰撞'''
        #子弹摧毁敌机
        pygame.sprite.groupcollide(self.hero.bullet,self.enemy_group,True,True)
        enemies = pygame.sprite.spritecollide(self.hero,self.enemy_group,True)
        if len(enemies) > 0:
            #让英雄机销毁
            self.hero.kill()
            while True:
                bg3 = pygame.image.load('素材/images/gameover2.png')
                self.screen.blit(bg3, (0, 0))
                pygame.display.update()
                time.sleep(0.1)
                self.__game_over()
                print("game over")
                clock1 = pygame.time.Clock()
                while True:
                    # 调用时钟对象，执行循环体内部的代码执行频率
                    clock1.tick(60)
                    # 监听事件
                    for event in pygame.event.get():
                        if event.type == pygame.QUIT:
                            print("直接退出游戏")
                            # 退出pygame,卸载所有的pygame
                            pygame.quit()
                            # 直接终止当前代码执行
                            exit()

        # 定义更新/绘制精灵和精灵组   ---调用私有化方法实现
    def __update_sprite(self):
        #背景图
        self.back_ground.update()
        self.back_ground.draw(self.screen)
        #敌机
        self.enemy_group.update()
        self.enemy_group.draw(self.screen)
        #英雄
        self.hero_grpup.update()
        self.hero_grpup.draw(self.screen)
        # 子弹精灵组
        self.hero.bullet.update()
        self.hero.bullet.draw(self.screen)
    #定义结束游戏方法
    def __game_over(self):
        tkinter.messagebox.askokcancel("FishC Demo", '游戏结束')
        # def show():
        #     tkinter.messagebox.showinfo(title='aaa', message='nyijing')
        #
        # def creatfram():
        #     root = tkinter.Tk()
        #     a = tkinter.Button(root, text="退出", command=show)
        #     a.pack()
        #     root.mainloop()
        # creatfram()
        pygame.quit()
        exit()
#程序入口
# __name__ 是当前模块名，当模块被直接运行时模块名为 __main__ 。
# 这句话的意思就是，当模块被直接运行时，以下代码块将被运行，
# 当模块是被导入时，代码块不被运行。
if __name__ == '__main__':
    #创建游戏对象
    game = PlaneGame()
    #启动游戏
    game.start_game()


